#ifndef MESSAGESHOWAREA_H
#define MESSAGESHOWAREA_H

#include <QScrollArea>
#include <QWidget>
#include <QGridLayout>
#include <QPushButton>
#include <QLabel>
#include <QPainter>
#include <QPainterPath>
#include <QScrollBar>
#include <QTimer>

#include "model/data.h"
#include "model/datacenter.h"

using model::Message;

///////////////////////////////
/// 消息展示区
///////////////////////////////

class MessageShowArea : public QScrollArea
{
    Q_OBJECT
public:
    MessageShowArea();

    // 尾插 Item
    void addMsgItem(bool isLeft, const Message& msg);
    // 头插 Item
    void addFrontMsgItem(bool isLeft, const Message& msg);
    // 清空 Item
    void clear();

    // to the end
    void verticalBarToEnd();

private:
    QWidget* container;
};

///////////////////////////////
/// Message Item
///////////////////////////////

class MessageItem : public QWidget
{
    Q_OBJECT;
public:
    MessageItem(bool isLeft);

    // 工厂模式创建 MessageItem 对象
    static MessageItem* makeMesageItem(bool isLeft, const Message& msg);
    // 工厂方法
    static QWidget* makeTextMessage(bool isLeft, const QString& text);
    static QWidget* makeImageMessage();
    static QWidget* makeFileMessage();
    static QWidget* makeSpeechMessage();

private:
    bool isLeft;
};

///////////////////////////////
/// 消息正文部分
///////////////////////////////

class MessageContentLabel : public QWidget
{
    Q_OBJECT
public:
    MessageContentLabel(const QString& text, bool isLeft);

    void paintEvent(QPaintEvent* event);

private:
    QLabel* label;
    bool isLeft;
};

#endif // MESSAGESHOWAREA_H
